<?php
/* 
 * Sistema Fácil - Desenvolvimento rápido de softwares baseado em sentenças em português
 * Copyright (C) 2010 Rodrigo Caldeira de Paula Lima 
 * 
 * Este arquivo é parte do Sistema Fácil
 *
 * Sistema Fácil é um software livre; você pode redistribui-lo e/ou 
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 2 da 
 * Licença, ou (na sua opnião) qualquer versão.
 * 
 * Este programa é distribuido na esperança que possa ser  util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
 * Licença Pública Geral GNU para maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 * */

class Relatorio {
	var $nome;
	var $configBase;
	var $colunas;
	var $tabelas;
	var $colunasOrdenacao;
	var $camposFiltro;
	var $camposAgrupamento;
	var $camposSomatoria;
	var $graficos;
	
	function __construct() {
		$this->colunas = array();
		$this->tabelas = array();
		$this->colunasOrdenacao = array();
		$this->camposFiltro = array();
		$this->camposAgrupamento = array();
		$this->camposSomatoria = array();
		$this->graficos = array();
	}
	
	function renderizar() {
		$camposQuery = "";
		$join = "";
		$where = "";
		$clausula = " WHERE ";
		$conteudo = "<div style='text-align: center; width: 100%'>";
		if (count($this->camposFiltro) > 0) {
			$conteudo .= "<div class='formFiltro'><form action='?Relatorios' method='post'>";
			$conteudo .= "<input type='hidden' name='Filtrar' value='1'/>";
			$conteudo .= "<input type='hidden' name='Relatorio' value='" . $this->nome . "'/>";
			foreach ($this->tabelas as $tabela) {
				$tabela->popularCampos($_POST);
			}
			foreach ($this->camposFiltro as $campoFiltro) {
				$campoFiltro->editavel = true;
				$campoFiltro->valorPadrao = "";
				$campoFiltro->nomeCampoEdicaoCondicional = "";
				$conteudo .= $campoFiltro->renderizar();
				if ($campoFiltro->valor) {
					$where .= $clausula;
					if ($campoFiltro->mostrarCampo) {
						$where .= "`" . $campoFiltro->tipoConfig . "`.`id`";
					} else {
						$where .= "`" . $campoFiltro->tabela->nome . "`.`" . $campoFiltro->nome . "`";
					}
					$where .= " = '" . $campoFiltro->valor . "' ";
					$clausula = " AND ";
				}
			}
			$conteudo .= "<input type='submit' value='Pesquisar'>";
			$conteudo .= "</div></form>";
		}
		$tamanhoLI = round(100 / count($this->colunas), 0);
		$conteudo .= "<div class='divListaConteudo'><ul class='ulCabecalhoListaConteudo'>";
		foreach ($this->colunas as $coluna) {
			$conteudo .= "<li style='width: $tamanhoLI%'>";
			$conteudo .= $coluna->nome;
			$conteudo .= "</li>";
			if ($coluna->mostrarCampo) {
				$camposQuery .= "`" . $coluna->tipoConfig . "`.`" . $coluna->mostrarCampo . "` AS `" . $coluna->tipoConfig . "_" . $coluna->mostrarCampo . "` ,";
				$join .= "LEFT JOIN `" . $coluna->tipoConfig . "` ON `" . $coluna->tabela->nome . "`.`" . $coluna->nome . "` = `" . $coluna->tipoConfig . "`.`id` ";
			} else {
				$camposQuery .= "`" . $coluna->tabela->nome . "`.`" . $coluna->nome . "` AS `" . $coluna->tabela->nome . "_" . $coluna->nome . "` ,";
			}
		}
		$conteudo .= "</ul>";
		$camposQuery = substr($camposQuery, 0, strlen($camposQuery) - 1);
		$from = " FROM ";
		foreach ($this->tabelas as $tabela) {
			if (strpos($join, "LEFT JOIN `" . $tabela->nome . "`") === FALSE) {
				$from .= $tabela->nome . ",";
			}
		}
		$from = substr($from, 0, strlen($from) - 1) . " ";
		
		if (count($this->camposAgrupamento) > 0) {
			if (count($this->colunasOrdenacao) == 0) {
				$this->colunasOrdenacao = $this->camposAgrupamento;
			} else {
				$joinColunas = $this->camposAgrupamento;
				foreach ($this->colunasOrdenacao as $colunaOrdenacao) {
					$achouColuna = false;
					foreach ($this->camposAgrupamento as $campoAgrupamento) {
						if ($campoAgrupamento->nome == $colunaOrdenacao->nome) {
							$achouColuna = true;
							break;
						}
					}
					if (!$achouColuna) {
						array_push($joinColunas, $colunaOrdenacao);
					}
				}
				$this->colunasOrdenacao = $joinColunas;
			}
		}
		
		if (count($this->colunasOrdenacao) > 0) {
			$orderby = " ORDER BY ";
			foreach ($this->colunasOrdenacao as $colunaOrdenacao) {
				if ($colunaOrdenacao->mostrarCampo) {
					$orderby .= "`" . $colunaOrdenacao->tipoConfig . "`.`" . $colunaOrdenacao->mostrarCampo . "` ,";
				} else {
					$orderby .= "`" . $colunaOrdenacao->tabela->nome . "`.`" . $colunaOrdenacao->nome . "` ,";
				}
			}
			$orderby = substr($orderby, 0, strlen($orderby) - 1);
		}
		$query = "SELECT " . $camposQuery . $from . $join . $where . $orderby;
		//echo $query;
		$result = mysql_query($query, $this->configBase->conn);
		$corlinha = "";
		$dadosRelatorio = array();
		$dadosRelatorio["_dados_"] = array();
		$i = 0;
		while ($registro = mysql_fetch_array($result)) {
			$dadosRelatorio["_dados_"][$i] = array();
			foreach ($this->colunas as $campo) {
				if ($campo->mostrarCampo) {
					$valor = $registro[$campo->tipoConfig . "_" . $campo->mostrarCampo];
				} else {
					$valor = $registro[$campo->tabela->nome . "_" . $campo->nome];
				}
				$dadosRelatorio["_dados_"][$i][$campo->nome] = $valor;
			}
			$i++;
		}
		
		if (count($this->camposAgrupamento) > 0) {
			$arrRefDadosCamposAgrupamento = array();
			$arrRefDadosCamposAgrupamento[0] =& $dadosRelatorio;
			$arrRefDadosCamposAgrupamentoNovo = array();
			foreach ($this->camposAgrupamento as $campoAgrupamento) {
				$iRefDados = 0;
				$iRefDadosNovo = 0;
				while ($iRefDados < count($arrRefDadosCamposAgrupamento)) {
					$valorCampoAgrupamentoAtual = "";
					$refDadosCamposAgrupamento =& $arrRefDadosCamposAgrupamento[$iRefDados];
					foreach ($refDadosCamposAgrupamento["_dados_"] as $registroRelatorio) {
						foreach ($registroRelatorio as $campoRelatorio => $valorCampoRelatorio) {
							if ($campoRelatorio == $campoAgrupamento->nome) {
								if ($valorCampoAgrupamentoAtual != $valorCampoRelatorio) {
									$refDadosCamposAgrupamento[$valorCampoRelatorio] = array();
									$refDadosCamposAgrupamento[$valorCampoRelatorio]["_dados_"] = array();
									$refDadosCamposAgrupamento[$valorCampoRelatorio]["_dados_"][0] = array();
									$valorCampoAgrupamentoAtual = $valorCampoRelatorio;
									$i = 0;
									$arrRefDadosCamposAgrupamentoNovo[$iRefDadosNovo++] =& $refDadosCamposAgrupamento[$valorCampoRelatorio]; 
								}
							}
						 	else {
								$refDadosCamposAgrupamento[$valorCampoAgrupamentoAtual]["_dados_"][$i][$campoRelatorio] = $valorCampoRelatorio;
							}
						}
						$i++;
					}
					unset($refDadosCamposAgrupamento["_dados_"]);
					$iRefDados++;
				}
				$arrRefDadosCamposAgrupamento = $arrRefDadosCamposAgrupamentoNovo;
				$arrRefDadosCamposAgrupamentoNovo = array();
			}
		}
		
		list($grupoRegistros, $registrosRelatorio) = each($dadosRelatorio);
		$registrosRelatorioAnterior = $registrosRelatorio;
		$qtdeColunasAgrupamento = 0;
		$nivelGrupo = 0;
		$profundidadeNivel = 0;
		$qtdeNiveis = 0;
		$contadorNivel = 0;
		$display = "";
		if (count($this->camposSomatoria) > 0 && count($this->camposAgrupamento) > 0) {
			$valoresSomatoriaGeral = array();
			$primeiroCampo = true;
			foreach ($this->colunas as $coluna) {
				if ($primeiroCampo) {
					$valoresSomatoriaGeral[$coluna->nome] = "Total Geral";	
					$primeiroCampo = false;
				} else {
					$valoresSomatoriaGeral[$coluna->nome] = "";
				}
			}
		}
		while ($grupoRegistros != "") {
			$nivelGrupo++;
			if ($grupoRegistros == "_dados_") {
				if (count($this->camposSomatoria) > 0) {
					$valoresSomatoria = array();
					$primeiroCampo = true;
					foreach ($this->colunas as $coluna) {
						if ($primeiroCampo) {
							$valoresSomatoria[$coluna->nome] = "Total";	
							$primeiroCampo = false;
						} else {
							$valoresSomatoria[$coluna->nome] = "";
						}
					}
				}
				foreach ($registrosRelatorio as $registroRelatorio) {
					$corlinha = ($corlinha == "#fff" ? "#ffc25e" : "#fff");
					$conteudo .= "<ul style='background-color: $corlinha;' class='ulListaConteudo'>";
					for ($i = 0; $i < count($this->camposAgrupamento); $i++) {
						$conteudo .= "<li style='width: $tamanhoLI%'>&nbsp;</li>";
					}
					foreach ($registroRelatorio as $campoRelatorio => $valorCampoRelatorio) {
						$conteudo .= "<li style='width: $tamanhoLI%'>";
						$conteudo .= $valorCampoRelatorio;
						$conteudo .= "</li>";
						if (count($this->camposSomatoria) > 0) {
							foreach ($this->camposSomatoria as $campoSomatoria) {
								if ($campoSomatoria->nome == $campoRelatorio) {
									if ($valoresSomatoria[$campoRelatorio] == "") {
										$valoresSomatoria[$campoRelatorio] = $valorCampoRelatorio;
									} else {
										$valoresSomatoria[$campoRelatorio] += $valorCampoRelatorio;
									}
									if (isset($valoresSomatoriaGeral)) {
										if ($valoresSomatoriaGeral[$campoRelatorio] == "") {
											$valoresSomatoriaGeral[$campoRelatorio] = $valorCampoRelatorio;
										} else {
											$valoresSomatoriaGeral[$campoRelatorio] += $valorCampoRelatorio;
										}
									}
								}
							}
						}
					}
					$conteudo .= "</ul>";
				}
				if (count($this->camposSomatoria) > 0) {
					$conteudo .= "<ul style='background-color: #ffffaf;' class='ulListaConteudo'>";
					foreach ($valoresSomatoria as $valorSomatoria) {
						$conteudo .= "<li style='width: $tamanhoLI%; font-weight: bold'>";
						$conteudo .= $valorSomatoria;
						$conteudo .= "</li>";
					}
					$conteudo .= "</ul>";
				}
				if ($qtdeNiveis == 0) {
					$qtdeNiveis = $nivelGrupo;
				}
				if (count($this->camposAgrupamento) > 0) {
					$qtdeColunasAgrupamento-= count($this->camposAgrupamento) - 1;
					list($grupoRegistros, $registrosRelatorio) = each($registrosRelatorioAnterior);
					list($grupoRegistros, $registrosRelatorio) = each($registrosRelatorioAnterior);
					if ($contadorNivel > 0) {
						$conteudo .= "</div>";
						$contadorNivel--;
					}
					if ($grupoRegistros == "") {
						$qtdeColunasAgrupamento = 0;
						list($grupoRegistros, $registrosRelatorio) = each($dadosRelatorio);
						$registrosRelatorioAnterior = $registrosRelatorio;
						$display = "";
						while ($contadorNivel > 0) {
							$conteudo .= "</div>";
							$contadorNivel--;
						}
					}
				} else {
					$grupoRegistros = "";
				}
			} else {
				$corlinha = ($corlinha == "#fff" ? "#ffc25e" : "#fff");
				$conteudo .= "<ul style='background-color: $corlinha;' class='ulListaConteudo' onclick='javascript:mostraNivelGrupoRelatorio($nivelGrupo);'>";
				if ($display == "" && count($this->camposAgrupamento) > 0) {
					$display = "display: none;";
				}
				$i = 0;
				while ($i < $qtdeColunasAgrupamento) {
					$conteudo .= "<li style='width: $tamanhoLI%'>&nbsp;</li>";
					$i++;
				}
				$conteudo .= "<li style='width: $tamanhoLI%'>";
				$conteudo .= "<span id='spanSinal$nivelGrupo'>&nbsp;+&nbsp;</span>";
				$conteudo .= $grupoRegistros;
				$conteudo .= "</li>";
				$i = 0;
				while ($i < count($this->colunas) - $qtdeColunasAgrupamento - 1) {
					$conteudo .= "<li style='width: $tamanhoLI%'>&nbsp;</li>";
					$i++;
				}
				$conteudo .= "</ul>";
				$conteudo .= "<div id='nivelGrupo$nivelGrupo' style='$display'>";
				$contadorNivel++;
				list($grupoRegistros, $registrosRelatorio) = each($registrosRelatorio);
				$qtdeColunasAgrupamento++;
			}
		}
		if (isset($valoresSomatoriaGeral)) {
			$conteudo .= "<ul style='background-color: #ffffaf;' class='ulListaConteudo'>";
			foreach ($valoresSomatoriaGeral as $valorSomatoriaGeral) {
				$conteudo .= "<li style='width: $tamanhoLI%; font-weight: bold'>";
				$conteudo .= $valorSomatoriaGeral;
				$conteudo .= "</li>";
			}
			$conteudo .= "</ul>";
		}
		$conteudo .= "</div>";
		$conteudo .= "<script type='text/javascript'>var qtdeNiveis = $qtdeNiveis;</script>";
		return $conteudo;
	}
}
?>